<?php

namespace App\Http\Controllers\Backend;


use Illuminate\Support\Facades\Config;
use Mews\Captcha\Facades\Captcha;

use App\Service\Image;

//use Intervention\Image\Image;
//use Intervention\Image\Facades\Image;
use Intervention\Image\ImageManagerStatic;
use Intervention\Image\ImageManager;
use Qiniu\Auth;
use Qiniu\Storage\UploadManager;

class DealController extends BaseController
{
    // 一般操作
    public function initialize()
    {
        parent::initialize();
    }

    // 验证码验证
    public function check()
    {
        // captcha为填写的验证码
        // key生成验证码返回的key
        $captcha = $this->getData('captcha', null, 'trim');
        $key     = $this->getData('key', null, 'trim');
        $this->throwIf(empty($captcha) || empty($key), '传递数据有误!!');

        // 验证验证码
        $is_ok = captcha_api_check($captcha, $key);
        $this->throwIf(!$is_ok, '验证码有误!!');

        return $this->success([], '验证码验证成功！！');
    }

    // 验证码
    // 参考文档 https://blog.csdn.net/qq78442761/article/details/125796778
    public function captcha()
    {
        // 展示验证码
        $image = Captcha::create("default", true);

        // 获取验证码的img作为图片显示
        return $this->success($image);
    }

    // 上传文件
    public function file()
    {
        $_is  = $this->getData('is_compress', 0, 'intval');
        $file = $this->request->file('file');
        $this->throwIf(!$file->isValid(), $file->getError());
        //$path = $file->store('images');

        // 缓存在tmp文件夹中的文件名 例如 php8933.tmp 这种类型的.
        $clientName = $file->getClientOriginalName();
        $tmpName    = $file->getFileName();
        $tmpSize    = $file->getSize();
        $this->throwIf($tmpSize > 10 * 1024 * 1024, '最大上传图片为10M!');

        // 这个表示的是缓存在tmp文件夹下的文件的绝对路径(这里要注意,如果我使用接下来的move方法之后, getRealPath() 就找不到文件的路径了.因为文件已经被移走了.所以这里道出了文件上传的原理,将文件上传的某个临时目录中,然后使用Php的函数将文件移动到指定的文件夹.)
        $realPath = $file->getRealPath();

        // 验证图片后缀
        $entension = strtolower($file->getClientOriginalExtension());  // 上传文件的后缀.
        $images    = ['bmp', 'dib', 'pcp', 'dif', 'wmf', 'jpg', 'tif', 'eps', 'cdr', 'iff', 'tga', 'pcd', 'mpt', 'png', 'jpeg', 'psd', 'tiff', 'bnp']; // 'gif',
        $voices    = ['mp3', 'wav', 'wma', 'mp2', 'flac', 'midi', 'ra', 'ape', 'aac', 'cda', 'mov'];
        $this->throwReturn($entension == 'gif', '请不要删除gif文件！！');
        $is_pic   = in_array($entension, $images);
        $is_voice = in_array($entension, $voices);
        $this->throwReturn((!$is_pic) && (!$is_voice), '请上传正确的文件格式！！');

        // 获取文件内容 在百度验证
        //$content = $file->getContent();
        //$this->baiduImageCensor($realPath); // 百度审核，两种传值都可以
        $this->baiduImageCensor($file); // 百度审核，两种传值都可以


        // 大家对mimeType应该不陌生了. 我得到的结果是 image/jpeg.(这里要注意一点,以前我们使用 mime_content_type() ,在php5.3 之后,开始使用 fileinfo 来获取文件的mime类型.所以要加入 php_fileinfo的php拓展.windows下是 php_fileinfo.dll,在php.ini文件中将 extension=php_fileinfo.dll前面的分号去掉即可.当然要重启服务器. )
        $mimeTye = $file->getMimeType();
        // (第一种)最后我们使用
        $newName = md5(date("Y-m-d H:i:s").$clientName).".".$entension;
        $path    = 'storage/uploads/'.date("Ym").'/'.date('d');;
        $local    = '/'.date("Ym").'/'.date('d'); // 上传到本地目录 上个的单独域名访问
        $path     = '../../cdn'.$local; // 上传到本地目录
        $res      = $file->move($path, $newName);
        $filePath = $path.'/'.$newName;
        // 如果你这样写的话,默认是会放置在 我们 public/storage/uploads/
        // $path = $file -> move(app_path().'/storage/uploads',$newName);
        // 这里app_path()就是app文件夹所在的路径.$newName 可以是你通过某种算法获得的文件的名称.主要是不能重复产生冲突即可. 比如 $newName = md5(date("Y-m-d H:i:s").$clientName).".".$entension;

        // 如果是图片
        if($is_pic){
            // 图片截取
            $image  = Image::open($filePath);
            $width  = $image->width();  // 返回图片的宽度
            $height = $image->height();  // 返回图片的高度
            // 压缩
            if($_is){
                $toWidth = 800;
                if($width > $toWidth){
                    //$toHeight = $height * $width / $toWidth;
                    $toHeight = $height * $toWidth / $width;
                    $size     = $image->thumb($toWidth, $toHeight)->save($filePath);
                } else{
                    //
                    $size = $image->thumb($width, $height)->save($filePath);
                }
            }
            // 缩略图
            $toWidth = 200;
            if($width > $toWidth){
                $toHeight = $height * $width / $toWidth;
                $filePath = $filePath.".150px.".$entension;
                $size     = $image->thumb($toWidth, $toHeight)->save($filePath);
            }
        }

        // 组合域名地址
        $domain = Config::get('site.cdnHost');
        if(substr($domain, -1) == '/'){
            $domain = substr($domain, 0, -1);
        }
        $src = $domain.$local.'/'.$newName;


        return $this->success($src);
    }

    // 图片信息（测试）
    public function image()
    {
        $src = './storage/uploads/202301/b4cda49cdd6bf63f5bc7dca07e65c4f1.png';
        //$src = './storage/uploads/202301/2.png';
        //$src = './storage/uploads/202301/3.png';
        $src = './storage/uploads/202301/8.png';
        //$src = './storage/uploads/202301/1111.jpg';
        //$src = './storage/uploads/202301/1.png';
        //$img = Image::make($src)->resize(500, 400);

        /*$manager = new ImageManager(array('driver' => 'imagick'));
        $img = $manager->make($src)->resize(500, 400);*/
        $this->throwReturn(!is_file($src), '文件不存在！');


        $image = Image::open($src);

        // 返回图片的宽度
        $width = $image->width();
        // 返回图片的高度
        $height = $image->height();
        // 返回图片的类型
        $type = $image->type();
        // 返回图片的mime类型
        $mime = $image->mime();
        // 返回图片的尺寸数组 0 图片宽度 1 图片高度
        $size = $image->size();

        $toWidth  = 870;
        $toHeight = $height * $width / $toWidth;
        $size     = $image->thumb($toWidth, $toHeight)->save($src);
        var_dump($size);

        // 按照原图的比例生成一个最大为150*150的缩略图并保存为thumb.png
        //$image->thumb($width, $height)->save($to);


        // 上传
        /*$upload = new Upload();
         $info   = $upload->upload($_FILES);
         if(!$info){
             return $this->error($upload->getError()); // 上传错误提示错误信息
         }
         return $this->success($info);*/

    }

    // 上传七牛云（并压缩图片在上传）
    public function qiniu()
    {
        $file = $this->request->file('file');
        $this->throwIf(!$file->isValid(), $file->getError());

        // 验证图片后缀
        //$entension = strtolower($file->getExtension());  // 上传文件的后缀.
        $entension = strtolower($file->getClientOriginalExtension());  // 上传文件的后缀.
        $images    = ['bmp', 'dib', 'pcp', 'dif', 'wmf', 'jpg', 'tif', 'eps', 'cdr', 'iff', 'tga', 'pcd', 'mpt', 'png', 'jpeg', 'psd', 'tiff', 'bnp']; // 'gif',
        $voices    = ['mp3', 'wav', 'wma', 'mp2', 'flac', 'midi', 'ra', 'ape', 'aac', 'cda', 'mov'];
        $this->throwReturn($entension == 'gif', '请不要删除gif文件！！');
        $is_pic   = in_array($entension, $images);
        $is_voice = in_array($entension, $voices);
        $fileName = $file->getPathname();
        $this->throwReturn((!$is_pic) && (!$is_voice), '请上传正确的文件格式！！');

        // 获取文件内容 在百度验证
        if($is_pic){
            //$content = $file->getContent();
            //$this->baiduImageCensor($realPath); // 百度审核，两种传值都可以
            $this->baiduImageCensor($file); // 百度审核，两种传值都可以
        }


        // 上传参数
        $to        = 'app/'.date('Y/Ym/d/').date('Ymd').microtime(true).mt_rand().'.'.$entension;
        $qiUpload  = new UploadManager();
        $accessKey = config('filesystems.disks.qiniu.access_key');
        $secretKey = config('filesystems.disks.qiniu.secret_key');
        $bucket    = config('filesystems.disks.qiniu.bucket');//上传空间名称

        // 上传
        $auth  = new Auth($accessKey, $secretKey);
        $token = $auth->uploadToken($bucket);
        $res   = $qiUpload->putFile($token, $to, $fileName, null, $file->getMimeType(), false);

        // 压缩 在上传
        if($is_pic){
            $to_local  = $fileName.'_thumb.jpg';
            $to_to     = $to.'_thumb.jpg';
            $this->toCompress($fileName, $to_local);
            $res = $qiUpload->putFile($token, $to_to, $to_local, null, $file->getMimeType(), false);
        }


        // 组合域名地址
        $domain = Config::get('site.cdnHost');
        if(substr($domain, -1) != '/'){
            $domain = $domain.'/';
        }
        $to = $domain.$to;

        return $this->success($to);
    }

    // 上传七牛云
    public function qiniu2()
    {
        $file = $this->request->file('file');
        $this->throwIf(!$file->isValid(), $file->getError());

        // 验证图片后缀
        $entension = strtolower($file->getClientOriginalExtension());  // 上传文件的后缀.
        $images    = ['bmp', 'dib', 'pcp', 'dif', 'wmf', 'jpg', 'tif', 'eps', 'cdr', 'iff', 'tga', 'pcd', 'mpt', 'png', 'jpeg', 'psd', 'tiff', 'bnp']; // 'gif',
        $voices    = ['mp3', 'wav', 'wma', 'mp2', 'flac', 'midi', 'ra', 'ape', 'aac', 'cda', 'mov'];
        $this->throwReturn($entension == 'gif', '请不要删除gif文件！！');
        $is_pic   = in_array($entension, $images);
        $is_voice = in_array($entension, $voices);
        $this->throwReturn((!$is_pic) && (!$is_voice), '请上传正确的文件格式！！');

        // 获取文件内容 在百度验证
        if($is_pic){
            //$content = $file->getContent();
            //$this->baiduImageCensor($realPath); // 百度审核，两种传值都可以
            $this->baiduImageCensor($file); // 百度审核，两种传值都可以
        }


        $time     = 'back/'.date('Y/Ym/d');
        $disk     = \Storage::disk('qiniu'); //使用七牛云上传
        $filename = $disk->put($time, $file);//上传至七牛云
        $this->throwIf(!$filename, "上传失败");

        // http://slh.caitongnews.com/2022-12-30/f8THIo9E76GyWkKUneqG7MMp6SnOPqCzO7EsjbTT.jpg
        $img_url = $disk->getDriver()->downloadUrl($filename); //获取下载链接

        return $this->success($img_url);
    }


}


